package cbm.seguridad.controller;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;

import cbm.commons.BaseController;
import cbm.commons.ConstantsWeb;
import cbm.commons.RequestHelper;
import cbm.commons.ResultadoOperacionBean;
import cbm.commons.SessionContainer;
import ejb.cbm.commons.StackTrace2String;
import ejb.cbm.seguridad.bean.RegistroIngresoBean;
import ejb.cbm.seguridad.bean.UsuarioBean;
import ejb.cbm.seguridad.local.UsuarioFacadeLocal;

public class UsuarioController extends BaseController{
	
	public UsuarioFacadeLocal usuarioFacadeLocal;

	public ModelAndView open(HttpServletRequest request, HttpServletResponse response){
		String pagSig = resources.getString("gestion_usuarios");
		return new ModelAndView(pagSig);
	}

	public ModelAndView save(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = request.getSession(false);
		String paginaSig = resources.getString("ajaxrequest");
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		Context context = null;
		UsuarioBean usuarioBean = null;
		UsuarioBean usuarioLogeado = (UsuarioBean)sessionContainer.getSessionElement(ConstantsWeb.USUARIO);
		String tituloPopUp = "";
		try{
			usuarioBean = getUsuarioBean(request);

			context = new InitialContext();
			usuarioFacadeLocal=(UsuarioFacadeLocal)context.lookup("CBM/UsuarioFacade/local");
			usuarioFacadeLocal.save(usuarioBean,usuarioLogeado);
			
			usuarioBean = usuarioFacadeLocal.buscar(usuarioBean.getCodigousuario());
			tituloPopUp = "Modificar Usuario";
			
		}catch(RuntimeException e){
			e.printStackTrace();
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al grabar");
			resultado.setMensaje("RuntimeException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(NamingException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al grabar");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}
		
		sessionContainer.addTemporal(ConstantsWeb.RESULTADO_OPERACION, resultado);
		sessionContainer.addTemporal(ConstantsWeb.USUARIO, usuarioBean);
		sessionContainer.addTemporal(ConstantsWeb.TITULOPOPUP, tituloPopUp);
		
		return new ModelAndView(paginaSig,ConstantsWeb.RPTA_AJAX_REQUEXT,resultado.getAsArrayJS());
	}

	public ModelAndView buscar(HttpServletRequest request, HttpServletResponse response){
		
		HttpSession session = request.getSession(false);
		String paginaSig = "seguridad/GestionarUsuariosTabla.jsp";
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		RegistroIngresoBean registroIngreso = (RegistroIngresoBean)sessionContainer.getSessionElement(ConstantsWeb.REGISTRO_INGRESO);
		Context context = null;
		UsuarioBean filtro = null;
		List<UsuarioBean> lista = null;
		
		try{
			filtro = getUsuarioBean(request);
			context = new InitialContext();
			usuarioFacadeLocal=(UsuarioFacadeLocal)context.lookup("CBM/UsuarioFacade/local");
			
			lista = usuarioFacadeLocal.buscar(filtro,registroIngreso);
									 
			if (lista.size() == 0) lista = null;
			
		}catch(RuntimeException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al buscar");
			resultado.setMensaje(ConstantsWeb.MSGERROR);
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
			e.printStackTrace();
		}catch(NamingException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al buscar");
			resultado.setMensaje(ConstantsWeb.MSGERROR);
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
			e.printStackTrace();
		} catch (SQLException e) {
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al buscar");
			resultado.setMensaje(ConstantsWeb.MSGERROR);
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
			e.printStackTrace();
		}
		
		sessionContainer.addTemporal(ConstantsWeb.RESULTADO_OPERACION, resultado);
		sessionContainer.addTemporal(ConstantsWeb.GRILLA, lista);
		
		return new ModelAndView(paginaSig,ConstantsWeb.RPTA_AJAX_REQUEXT,resultado.getAsArrayJS());
	}

	public UsuarioBean getUsuarioBean(HttpServletRequest request) {
		UsuarioBean usuarioBean = null;
		try {
			String codigoUsuario = RequestHelper.getParameterString(request,"txtCodigoUsuario");
			String apellidoPaterno = RequestHelper.getParameterString(request,"txtApellidoPaterno");
			String apellidoMaterno = RequestHelper.getParameterString(request,"txtApellidoMaterno");
			String nombre = RequestHelper.getParameterString(request,"txtNombre");
			Long perfil = RequestHelper.getParameterLong(request,"selPerfil");
			Long estado = RequestHelper.getParameterLong(request,"selEstado");
			String telefono = RequestHelper.getParameterString(request,"txtTelefono");
			String email = RequestHelper.getParameterString(request,"txtEmail");
			String codigooficina = RequestHelper.getParameterString(request,"txtCodigoOficina");
			
			usuarioBean = new UsuarioBean();
			usuarioBean.setCodigousuario(codigoUsuario);
			usuarioBean.setApellidomaterno(apellidoMaterno);
			usuarioBean.setApellidopaterno(apellidoPaterno);
			usuarioBean.setNombre(nombre);
			usuarioBean.getPerfilBean().setCodigoperfil(perfil);
			usuarioBean.setFlagactivo(estado);
			usuarioBean.setTelefono(telefono);
			usuarioBean.setCorreoelectronico(email);
			usuarioBean.setCodigooficina(codigooficina);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return usuarioBean;
	}

	public ModelAndView seleccionar(HttpServletRequest request, HttpServletResponse response){
		return new ModelAndView();
	}

	public ModelAndView eliminar(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = request.getSession(false);
		String paginaSig = "seguridad/GestionarUsuariosTabla.jsp";
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		UsuarioBean usuarioLogeado = (UsuarioBean)sessionContainer.getSessionElement(ConstantsWeb.USUARIO);
		RegistroIngresoBean registroIngreso = (RegistroIngresoBean)sessionContainer.getSessionElement(ConstantsWeb.REGISTRO_INGRESO);
		Context context = null;
		UsuarioBean usuarioBean = null;
		List<UsuarioBean> lista = null;
		
		try{
			String codigoUsuario = request.getParameter("hidCodigoUsuario");
			usuarioBean = new UsuarioBean();
			usuarioBean.setCodigousuario(codigoUsuario);
			usuarioBean.setFechamodificacion(new Date(System.currentTimeMillis()));
			usuarioBean.setUsuariomodificacion(registroIngreso.getCodigousuario());
			usuarioBean.setFlagactivo(new Long(0));
			
			context = new InitialContext();
			usuarioFacadeLocal=(UsuarioFacadeLocal)context.lookup("CBM/UsuarioFacade/local");
			usuarioFacadeLocal.save(usuarioBean, usuarioLogeado);
			
			usuarioBean = getUsuarioBean(request);
			context = new InitialContext();
			
			lista = usuarioFacadeLocal.buscar(usuarioBean,registroIngreso);
			
			if (lista.size() == 0) lista=null;
			
		}catch(RuntimeException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("RuntimeException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(NamingException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch (SQLException e) {
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al buscar");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}
		sessionContainer.addTemporal(ConstantsWeb.GRILLA, lista);
		
		return new ModelAndView(paginaSig);
	}
	
	public ModelAndView openMantenimiento(HttpServletRequest request, HttpServletResponse response){
		String pagSig = "seguridad/UsuarioMnt.jsp";
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		HttpSession session = request.getSession(false);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		Context context = null;
		UsuarioBean usuarioBean = null;
		String tituloPopUp = "Nuevo Usuario";
		
		try{
			String codigoUsuario = RequestHelper.getParameterString(request,"codigoUsuario");
		    usuarioBean = new UsuarioBean();
			
			context = new InitialContext();
			usuarioFacadeLocal=(UsuarioFacadeLocal)context.lookup("CBM/UsuarioFacade/local");
			
			if (codigoUsuario != null && !codigoUsuario.trim().equals("")){
				usuarioBean = usuarioFacadeLocal.buscar(codigoUsuario);
				tituloPopUp = "Modificar Usuario";
			}

		}catch(RuntimeException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("RuntimeException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(NamingException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}
		sessionContainer.addTemporal(ConstantsWeb.USUARIO, usuarioBean);
		sessionContainer.addTemporal(ConstantsWeb.TITULOPOPUP, tituloPopUp);
		
		return new ModelAndView(pagSig);
	}
}